package com.example.utils;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;

import java.util.List;

public class Fastjson2ConverterUtils {

    private Fastjson2ConverterUtils() {}

    // ==================== 对象 <-> JSON 字符串 ====================

    /**
     * 对象转 JSON 字符串
     */
    public static String toJson(Object obj) {
        if (obj == null) return null;
        return JSON.toJSONString(obj);
    }

    /**
     * JSON 字符串转对象
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        if (json == null || clazz == null) return null;
        return JSON.parseObject(json, clazz);
    }

    /**
     * JSON 字符串转对象（支持泛型，如 Map<String, List<User>>）
     */
    public static <T> T fromJson(String json, TypeReference<T> typeRef) {
        if (json == null || typeRef == null) return null;
        return JSON.parseObject(json, typeRef);
    }

    // ==================== 对象 <-> JSONObject ====================

    /**
     * 对象转 JSONObject
     */
    public static JSONObject toJsonObject(Object obj) {
        if (obj == null) return null;
        return (JSONObject) JSON.toJSON(obj);
    }

    /**
     * JSONObject 转对象
     */
    public static <T> T fromJsonObject(JSONObject jsonObject, Class<T> clazz) {
        if (jsonObject == null || clazz == null) return null;
        return jsonObject.toJavaObject(clazz);
    }

    // ==================== List <-> JSON 字符串/JSONArray ====================

    /**
     * 对象列表转 JSON 字符串
     */
    public static <T> String toJson(List<T> list) {
        if (list == null) return null;
        return JSON.toJSONString(list);
    }

    /**
     * JSON 字符串转对象列表（指定元素类型）
     */
    public static <T> List<T> fromJsonToList(String json, Class<T> itemClass) {
        if (json == null || itemClass == null) return null;
        return JSON.parseArray(json, itemClass);
    }

    /**
     * JSONArray 转对象列表
     */
    public static <T> List<T> fromJsonArrayToList(JSONArray jsonArray, Class<T> itemClass) {
        if (jsonArray == null || itemClass == null) return null;
        return jsonArray.toList(itemClass);
    }

    /**
     * 对象列表转 JSONArray
     */
    public static <T> JSONArray toJsonArray(List<T> list) {
        if (list == null) return null;
        return (JSONArray) JSON.toJSON(list);
    }

    // ==================== 便捷方法 ====================

    /**
     * 获取 JSONObject 中的字符串值（容错）
     */
    public static String getString(JSONObject jo, String key) {
        if (jo == null || key == null) return null;
        return jo.getString(key);
    }

    /**
     * 获取 JSONObject 中的整数值（容错）
     */
    public static Integer getInteger(JSONObject jo, String key) {
        if (jo == null || key == null) return null;
        return jo.getInteger(key);
    }
}
